/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package hello;

import java.io.*;
import java.lang.*;
import java.util.Date;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;

/**
 *
 * @author Carlos
 */
public class MyCanvas extends Canvas{
    
    private double[] valores;
    private double[] valoresReais;
    private String[] datas;
    private String empresa;
    private int largura;
    private int altura;
    
    public MyCanvas(String empresa, String[] datas, double [] valores)
    {
        this.valores = valores;
        this.datas = datas;
        this.empresa = empresa;
        
        int k=6;
        boolean flag = false;
        this.valoresReais = new double[7];
        for(int i=6; i>=0;i--)
        {
            flag = false;
            for(int j=0; j<numDiasFechada(datas[i-1], datas[i]);j++)
            {
                flag = true;
                valoresReais[k]=valores[i];
                k--;
                if(k==-1)
                    break;
            }
            if(k==-1)
                break;
            if(!flag)
            {
                valoresReais[k] = valores[i];
                k--;
                flag = false;
            }
        }
        
        setTitle("Histórico "+empresa);
        
        largura = getWidth();
        altura = getHeight();
        altura = (int) (altura - altura * 0.20);
        
    }

    protected void paint(Graphics g) {
        
        g.setColor(0xffffff);
        g.fillRect(0, 0, largura, altura);
        g.setColor(0x3300CC);

        Font font = Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
        g.setFont(font);
        
        double max = valoresReais[0];
        double min = valoresReais[0];
        
        
        //calcular valor máximo e mínimo
        for(int i=0; i<7;i++)
        {
            if(valoresReais[i]>max)
                max=valoresReais[i];
            if(valoresReais[i]<min)
                min=valoresReais[i];
        }
        
        boolean flagMax=false;
        boolean flagMin=false;
        
        int x1=0, y1=0, x2=0, y2=0;
        for (int i = 0; i < 6; i++) {
            x1 = (int) (((largura - largura * 0.1) / 8) * (i + 1));
            x1=(int) (x1 + largura * 0.05);
            x2 =(int) (((largura - largura * 0.1) / 8) * (i+2));
            x2=(int) (x2 + largura * 0.05);
            

            double proporcao = (max - valoresReais[i]) / (max - min);
            y1 = (int) (altura - (altura - (altura * proporcao)));
            y1 +=altura*0.2;

            proporcao = (max - valoresReais[i + 1]) / (max - min);
            y2 = (int) (altura - (altura - (altura * proporcao)));
            y2 +=altura*0.2;
            //y2 =  (int) (y2 - y2 * 0.1);
            
            g.fillArc(x1-5, y1-5, 10, 10, 0, 360);            
            g.drawLine(x1, y1, x2, y2);

            if(i==0)
            {
                g.drawString(datas[i], getWidth(), 15, Graphics.RIGHT|Graphics.BOTTOM);
            }
            

            if (valoresReais[i] == max && !flagMax) {
                flagMax = true;
                g.drawString(Double.toString(valoresReais[i]), x1, y1, 0);
            }
            if (valoresReais[i] == min && !flagMin){
                flagMin=true;
                g.drawString(Double.toString(valoresReais[i]), x1, y1, Graphics.LEFT | Graphics.BOTTOM);
            }

        }
        
        
        g.fillArc(x2-5, y2-5, 10, 10, 0, 360);
        if (valoresReais[6] == max && !flagMax) {
                flagMax = true;
                g.drawString(Double.toString(valoresReais[6]), x1, y1, 0);
            }
            if (valoresReais[6] == min && !flagMin){
                flagMin=true;
                g.drawString(Double.toString(valoresReais[6]), x1, y1, Graphics.LEFT | Graphics.BOTTOM);
            }
        g.drawString(datas[6], 75, 15, Graphics.RIGHT|Graphics.BOTTOM);
    }
    
    private int numDiasFechada(String dataAnterior, String dataActual){
        
        
        //identificar dia anterior (int)
        int indicePrimeiroHifen = dataAnterior.indexOf("-");        
        String diaAnteriorTemp = dataAnterior.substring(indicePrimeiroHifen);
        String diaAnteriorTemp2 = diaAnteriorTemp.substring(1);
        
        int indiceSegundoHifen = diaAnteriorTemp2.indexOf("-");
        int mesDiaAnterior = Integer.parseInt(diaAnteriorTemp2.substring(0, indiceSegundoHifen));
        int diaAnterior = Integer.parseInt(diaAnteriorTemp2.substring(indiceSegundoHifen));
        
        
        //identificar dia actual
        int indicePrimeiroHifen1 = dataActual.indexOf("-");        
        String diaActualTemp = dataActual.substring(indicePrimeiroHifen1);
        String diaActualTemp2 = diaActualTemp.substring(1);
        
        
        int indiceSegundoHifen1 = diaActualTemp2.indexOf("-");        
        int mesDiaActual = Integer.parseInt(diaActualTemp2.substring(0, indiceSegundoHifen1));
        int diaActual = Integer.parseInt(diaActualTemp2.substring(indiceSegundoHifen1));
        
        
        //retorna número de dias em que a bolsa esteve fechada
        if(diaActual - diaAnterior > 1)
            return diaActual - diaAnterior-1;
        if(diaActual - diaAnterior < 0 )
        {
            switch(mesDiaActual){
                case 1: return diaActual+31-diaAnterior-1;
                case 2: return diaActual+31-diaAnterior-1;
                case 3: return diaActual+28-diaAnterior-1;
                case 4: return diaActual+31-diaAnterior-1;
                case 5: return diaActual+30-diaAnterior-1;
                case 6: return diaActual+31-diaAnterior-1;
                case 7: return diaActual+30-diaAnterior-1;
                case 8: return diaActual+31-diaAnterior-1;
                case 9: return diaActual+31-diaAnterior-1;
                case 10: return diaActual+30-diaAnterior-1;
                case 11: return diaActual+31-diaAnterior-1;
                case 12: return diaActual+30-diaAnterior-1;                
            }         
            
        }        
     return 0;  
    }
    

}
